﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.Clasificacion_e_Incubacion;
using Tecnopez.Globals;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using BussinessLogicTecnoPez;

public partial class Modules_ClasificacionIncubacion_ABMParametroClasificacion : System.Web.UI.Page
{
    private System.Web.UI.WebControls.GridView grdDatos; //Para acceso rapido
    protected void Page_Load(object sender, EventArgs e)
    {
        //Este es para manipular la grilla mas facil dentro del abm.
        grdDatos = TecnopezDataGRIDABMView1.grdDatosAbmView;

        //Con estas lineas de codigo configuran toda la grilla no se necesita mas
        //El true or false determina si es compact o no, tambien tiene sobrecargado el metodo para recibir botones extra.
        //en ese caso van a tener que invocar el evento a manopla.
        TecnopezDataGRIDABMView1.setupGrid<ParametroDeClasificacion>(cargarGrilla, TecnopezDataGRIDABMView1_ViewGridClic, null, true, this.ViewState);


        cmdEliminar.Attributes.Add("onClick", "return confirm('Esta seguro de eliminar el registro?');");


        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/ic_soporte.gif";
        master.Titulo = "Gestión de Parámetros de Clasificación.";


        if (!IsPostBack)
        {
            this.setMode(PageMode.ListMode);
            InicializarCombos();
        }
    }

    private void InicializarCombos()
    {
        Especie.getManager.ClearFilters();
        Especie.getManager.ClearOrders();
        Especie.getManager.AddFilter("Baja", GenericManager<Especie>.filterOperator.Equals, "N");
        Especie.getManager.AddOrder("Nombre", GenericManager<Especie>.Order.orderDirection.ASC);
        cboABMEspecies.DataSource = Especie.getManager.GetFilter();
        cboABMEspecies.DataTextField = "nombre";
        cboABMEspecies.DataValueField = "idespecie";
        cboABMEspecies.DataBind();
    }

    void TecnopezDataGRIDABMView1_ViewGridClic(int indice)
    {
        cargarGrilla();
        int idParametro = (int)grdDatos.DataKeys[indice].Value;
        ParametroDeClasificacion.getManager.ClearFilters();
        ParametroDeClasificacion.getManager.AddFilter(grdDatos.DataKeyNames[0],BussinessLogicTecnoPez.GenericManager<ParametroDeClasificacion>.filterOperator.Equals, idParametro);
        ParametroDeClasificacion aux = ParametroDeClasificacion.getManager.GetOne();

        setearDatosALaInterfaz(aux);
        
        this.setMode(PageMode.ViewMode);
    }

    private void setearDatosALaInterfaz(ParametroDeClasificacion aux)
    {
        txtID.Text = aux.idParametroClasificacion.ToString();
        txtABMIntervalo.Text = aux.intervalo.ToString();
        txtABMRelacEdadTam.Text = aux.relacionEdadTamanio.ToString();
        if (aux.especie != null)
        {
            cboABMEspecies.SelectedValue = aux.especie.idespecie.ToString();
        }
        else
        {
            cboABMEspecies.SelectedIndex = 0;
        }
    }

    private void cargarGrilla()
    {
     
        ParametroDeClasificacion.getManager.ClearFilters();
        ParametroDeClasificacion.getManager.ClearOrders();
        if (ViewState["orden"] != null)
        {
            ParametroDeClasificacion.getManager.AddOrder(ViewState["orden"].ToString(), (GenericManager<ParametroDeClasificacion>.Order.orderDirection)ViewState["ordenDireccion"]);

        }
        //y no menos importante llenen la tabla!
        if (txtBuscarNombre.Text == string.Empty)
        {
            grdDatos.DataSource = ParametroDeClasificacion.getManager.GetFilter();
        }
        else
        {
            grdDatos.DataSource = ParametroDeClasificacion.buscarPorNombreDeEspecie(txtBuscarNombre.Text);
        }

        grdDatos.DataBind();
    }
    protected void cmdBuscar_Click(object sender, EventArgs e)
    {
        setMode(PageMode.ListMode);
    }
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        setMode(PageMode.NewMode);
    }

    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }

    private void setMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        txtID.Enabled = false;
        txtID.ForeColor = System.Drawing.Color.Black;
        lblResultado.Text = "";
        switch (mode)
        {
            case PageMode.EditMode:
                wzrABM.ActiveStepIndex = 1;
                cmdEditar.Visible = false;
                Functions.setearReadOnly(false,txtABMRelacEdadTam,txtABMIntervalo);
                cboABMEspecies.Enabled = true;
                cmdEliminar.Visible = false;
                break;
            case PageMode.ListMode:
                cargarGrilla();
                wzrABM.ActiveStepIndex = 0;
                break;
            case PageMode.NewMode:
                cmdEditar.Visible = false;
                cmdEliminar.Visible = false;
                Functions.limpiarTextBoxes(txtBuscarNombre, txtABMIntervalo, txtABMRelacEdadTam);
                
                Functions.setearReadOnly(false, txtABMRelacEdadTam, txtABMIntervalo);
                cboABMEspecies.Enabled = true;
                cboABMEspecies.SelectedIndex = -1;
                txtID.Text = "";
                wzrABM.ActiveStepIndex = 1;
                break;
            case PageMode.ViewMode:
                wzrABM.ActiveStepIndex = 1;
                cmdEditar.Visible = true;
                cmdEliminar.Visible = true;
                Functions.setearReadOnly(true, txtABMRelacEdadTam, txtABMIntervalo);
                cboABMEspecies.Enabled = false;
                break;
            case PageMode.DeleteMode:
                break;
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        lblResultado.Text = "";
        setMode(PageMode.ListMode);
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        if (getMode() == PageMode.NewMode)
        {
            int idEspecie;
            if (Int32.TryParse(cboABMEspecies.SelectedValue, out idEspecie))
            {
                Especie esp = Especie.getManager.GetOneByPrimaryKey(idEspecie);
                if (esp.parametro != null)
                {
                    lblResultado.Text = "La especie seleccionada ya tiene un parámetro de clasificación creado.";
                    return;
                }
                else
                {
                    lblResultado.Text = "";
                }
            }

            AltaEntidad();

        }
        else if (getMode() == PageMode.EditMode)
        {
            ModificacionEntidad();
        }
        else
        {
            this.setMode(PageMode.ListMode);
        }
    }

    private void ModificacionEntidad()
    {
        int idEspecie = int.Parse(txtID.Text);
        ParametroDeClasificacion.getManager.ClearFilters();
        ParametroDeClasificacion.getManager.AddFilter(grdDatos.DataKeyNames[0], BussinessLogicTecnoPez.GenericManager<ParametroDeClasificacion>.filterOperator.Equals, idEspecie);
        ParametroDeClasificacion aux = ParametroDeClasificacion.getManager.GetOne();


        if (obtenerDatosDeLaInterfaz(aux) && validar(aux) && ParametroDeClasificacion.getManager.Update(aux))
        {
            lblResultado.Text = "Se modificó con exito";
            this.setMode(PageMode.ListMode);
            cargarGrilla();

        }
        else
        {
            lblResultado.Text = "Error al modificar. Verifique los datos.";
            Functions.LogError(ParametroDeClasificacion.getManager.GeneratedException);
        }
    }

    private bool obtenerDatosDeLaInterfaz(ParametroDeClasificacion aux)
    {
        try
        {
            aux.intervalo = Convert.ToInt32(txtABMIntervalo.Text);
            aux.relacionEdadTamanio = Convert.ToDecimal(txtABMRelacEdadTam.Text);
            Especie.getManager.ClearFilters();
            int idEspecie = Convert.ToInt32(cboABMEspecies.SelectedValue);
            Especie.getManager.AddFilter("idespecie", GenericManager<Especie>.filterOperator.Equals, idEspecie);
            aux.especie = Especie.getManager.GetOne();
            return true;
        }
        catch 
        {
            this.lblResultado.Text = "Error al cargar los datos verifique por favor.";
            return false;
        }
    }

    private void AltaEntidad()
    {
        ParametroDeClasificacion nueva = new ParametroDeClasificacion();

        

        if (validar(nueva))
        {
            if (obtenerDatosDeLaInterfaz(nueva) && ParametroDeClasificacion.getManager.Insert(nueva))
            {
                lblResultado.Text = "Parámetro de clasificación creado con éxito.";
                this.setMode(PageMode.ListMode);
                cargarGrilla();

            }
            else
            {
                lblResultado.Text = "Error el parámetro de clasficiación. Verifique los datos.";
                Functions.LogError(ParametroDeClasificacion.getManager.GeneratedException);
            }
        }

    }

    private bool validar(ParametroDeClasificacion objeto)
    {
        ValidationResults v = Validation.Validate<ParametroDeClasificacion>(objeto);
        if (!v.IsValid)
        {
            lblResultado.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }



    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        this.setMode(PageMode.EditMode);
    }

    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        this.setMode(PageMode.DeleteMode);
        EliminarEntidad();
    }



    private void EliminarEntidad()
    {
        if (getMode() == PageMode.DeleteMode)
        {
            int idEspecie = int.Parse(txtID.Text);
            ParametroDeClasificacion.getManager.ClearFilters();
            ParametroDeClasificacion.getManager.AddFilter(grdDatos.DataKeyNames[0], BussinessLogicTecnoPez.GenericManager<ParametroDeClasificacion>.filterOperator.Equals, idEspecie);
            ParametroDeClasificacion aux = ParametroDeClasificacion.getManager.GetOne();
            if (ParametroDeClasificacion.getManager.Delete(aux)>0)
            {
                lblResultado.Text = "Parámetro de clasificación eliminado con exito.";
                this.setMode(PageMode.ListMode);
                cargarGrilla();

            }
            else
            {
                lblResultado.Text = "Error al eliminar el parámetro de clasificación.";
                Functions.LogError(ParametroDeClasificacion.getManager.GeneratedException);
            }
        }
    }

    protected void btnSi_Click1(object sender, EventArgs e)
    {

        EliminarEntidad();

    }

    protected void lnkCalculadora_Click(object sender, EventArgs e)
    {
        wzrABM.ActiveStepIndex = 2;
    }
    protected void btnVovlerCalculadora_Click(object sender, EventArgs e)
    {
        wzrABM.ActiveStepIndex = 1;
    }

    /// <summary>
    /// Funcion de calculo de parametros.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnCalculo_Click(object sender, EventArgs e)
    {
        double tamIni;
        double tamFin;
        double sigTam;
        int inter;
        try
        {
            tamIni = Convert.ToDouble(txtTamIni.Text);
            tamFin = Convert.ToDouble(txtTamFin.Text);
            inter = Convert.ToInt32(txtDias.Text);
            sigTam = Convert.ToDouble(txtTamSig.Text);
            ParametroDeClasificacion oParam = new ParametroDeClasificacion();
            if (oParam.calcular(tamIni, tamFin, inter, sigTam))
            {
                txtABMIntervalo.Text = oParam.intervalo.ToString();
                txtABMRelacEdadTam.Text = oParam.relacionEdadTamanio.ToString();
                lblResultado.Text = "El resultado del calculo fue automáticamente incluido en los campos de este formulario.";
            }
            else
            {
                this.lblResultado.Text = oParam.mensaje;
            }
        }
        catch 
        {
            this.lblResultado.Text = "A ocurrido algún error al intentar realizar el calculo, verifique que haya colocado correctamente numeros en todos los campos.";
        }
        finally
        {
            wzrABM.ActiveStepIndex = 1;
        }
    }
}
